
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>java怎么调用C语言SDK - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>java怎么调用C语言SDK - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">文档中介绍了哪三种在 Java 中调用 C 语言 SDK 的主要方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中介绍了三种主要方式：1. 使用 JNI（Java Native Interface）；2. 使用 JNA（Java Native Access）；3. 使用 Java 的 Process 运行 C 语言可执行程序。</div>
          </div>
          <div class="card-source">来源: 文档开篇及各章节标题</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">JNI (Java Native Interface) 主要适用于哪些场景？其核心优缺点是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">JNI 适用于高性能需求或者需要调用底层系统 API 的场景。其优点是速度快、可直接操作内存；缺点是需要编写额外的 C 代码，实现过程较为复杂。</div>
          </div>
          <div class="card-source">来源: 1. 使用 JNI（Java Native Interface） 及 总结</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">使用 JNI 技术时，从 Java 代码生成 C 语言头文件的关键命令是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">使用 `javah -jni ClassName` 命令。例如，对于 `NativeLib.java`，命令是 `javah -jni NativeLib`，它会生成一个包含本地方法声明的 C 头文件 `NativeLib.h`。</div>
          </div>
          <div class="card-source">来源: 1. 使用 JNI（Java Native Interface） -> 步骤 -> 3. 生成 C 头文件</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">对比</div>
          <div class="card-question">JNA (Java Native Access) 与 JNI 相比，其主要优势体现在哪里？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">对比</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">JNA 的主要优势是比 JNI 更易用。它通过动态代理方式调用本地 C 语言库，无需编写额外的 C/C++ 粘合代码和头文件，从而使得代码量更少，开发更简单。</div>
          </div>
          <div class="card-source">来源: 2. 使用 JNA（Java Native Access） 及 总结</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在 JNA 中，如何将一个 Java 接口动态映射到 C 语言的动态库？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">首先定义一个继承自 `com.sun.jna.Library` 的 Java 接口，然后在该接口内部通过 `Native.load("库名", 接口类.class)` 的方式加载动态库，并将其映射到该接口的实例上。</div>
          </div>
          <div class="card-source">来源: 2. 使用 JNA（Java Native Access） -> 步骤 -> 2. 编写 Java 代码</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在什么情况下，使用 Java 的 `Process` 类来与 C 代码交互是合适的选择？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当 C 语言部分是一个独立的可执行程序（例如 `.exe` 或 `.out` 文件）时，使用 `Process` 是合适的。Java 程序可以通过 `Runtime.getRuntime().exec()` 启动该 C 程序，并通过标准输入输出流进行数据通信。</div>
          </div>
          <div class="card-source">来源: 3. 使用 Java 的 Process 运行 C 语言可执行程序 及 总结</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 JNI 的 Java 代码中，加载本地动态链接库（如 .dll 或 .so）的推荐位置和方法是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">推荐在类的静态代码块 `static { ... }` 中使用 `System.loadLibrary("库名")` 方法来加载动态链接库。</div>
          </div>
          <div class="card-source">来源: 1. 使用 JNI（Java Native Interface） -> 步骤 -> 1. 编写 Java 代码</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">对比</div>
          <div class="card-question">根据文档总结，在选择 JNI 和 JNA 时，应该基于什么核心标准进行权衡？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">对比</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">应该基于性能和开发简易性进行权衡。如果需要高性能和深度集成，建议使用 JNI；如果只是简单地调用 C 语言库且优先考虑开发效率，推荐使用 JNA。</div>
          </div>
          <div class="card-source">来源: 总结</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 Linux/macOS 环境下编译 C 代码以供 JNI 或 JNA 调用时，生成共享库（.so 文件）为何通常需要添加 `-fPIC` 参数？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为共享库需要在内存中的任意位置加载，`-fPIC` 参数用于生成“位置无关代码”(Position-Independent Code)，这使得代码在加载到内存时无需重定位，是创建共享库所必需的。</div>
          </div>
          <div class="card-source">来源: 1. 使用 JNI（Java Native Interface） -> 步骤 -> 5. 编译 C 代码生成动态库</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
